@@ -15,8 +15,8 @@ from TimeConvert import TimeConvert as tc |
||
15 | 15 |
|
16 | 16 |
from account.models import UserInfo |
17 | 17 |
from coupon.models import UserCouponInfo |
18 |
-from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityGroupShareInfo, MemberActivityInfo, |
|
19 |
- MemberActivitySigninInfo, MemberActivitySignupInfo, RightInfo) |
|
18 |
+from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContributionInfo, MemberActivityGroupShareInfo, |
|
19 |
+ MemberActivityInfo, MemberActivitySigninInfo, MemberActivitySignupInfo, RightInfo) |
|
20 | 20 |
from utils.error.errno_utils import (MemberActivityStatusCode, MemberCouponStatusCode, MemberGoodStatusCode, |
21 | 21 |
MemberRightStatusCode, UserStatusCode) |
22 | 22 |
from utils.redis.connect import r |
@@ -508,3 +508,34 @@ def activity_group_share(request): |
||
508 | 508 |
return response(400002, 'Activity has been offline', '会员活动已下线') |
509 | 509 |
|
510 | 510 |
return response() |
511 |
+ |
|
512 |
+ |
|
513 |
+@logit |
|
514 |
+def activity_contribute(request): |
|
515 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) |
|
516 |
+ user_id = request.POST.get('user_id', '') |
|
517 |
+ activity_id = request.POST.get('activity_id') |
|
518 |
+ content_type = get_query_value(request, 'content_type', val_cast_type='int') |
|
519 |
+ title = request.POST.get('title', '') |
|
520 |
+ content = request.POST.get('content', '') |
|
521 |
+ images = get_query_value(request, 'images', val_cast_type='listjson') |
|
522 |
+ |
|
523 |
+ # 校验用户是否存在 |
|
524 |
+ try: |
|
525 |
+ UserInfo.objects.get(user_id=user_id) |
|
526 |
+ except UserInfo.DoesNotExist: |
|
527 |
+ return response(UserStatusCode.USER_NOT_FOUND) |
|
528 |
+ |
|
529 |
+ contribution = MemberActivityContributionInfo.objects.create( |
|
530 |
+ brand_id=brand_id, |
|
531 |
+ user_id=user_id, |
|
532 |
+ activity_id=activity_id, |
|
533 |
+ content_type=content_type, |
|
534 |
+ title=title, |
|
535 |
+ content=content, |
|
536 |
+ images=images, |
|
537 |
+ ) |
|
538 |
+ |
|
539 |
+ return response(data={ |
|
540 |
+ 'contribution': contribution.data, |
|
541 |
+ }) |
@@ -228,6 +228,8 @@ urlpatterns += [ |
||
228 | 228 |
|
229 | 229 |
url(r'^member/activity/group_share$', member_views.activity_group_share, name='member_activity_group_share'), |
230 | 230 |
|
231 |
+ url(r'^member/activity/contribute$', member_views.activity_contribute, name='member_activity_contribute'), |
|
232 |
+ |
|
231 | 233 |
url(r'^rights$', member_views.rights, name='rights'), |
232 | 234 |
url(r'^right/detail$', member_views.right_detail, name='right_detail'), |
233 | 235 |
url(r'^goods$', member_views.goods, name='goods'), |
@@ -5,8 +5,9 @@ from django.contrib import admin |
||
5 | 5 |
from django_admin import DeleteModelAdmin |
6 | 6 |
|
7 | 7 |
from account.models import UserInfo |
8 |
-from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityGroupShareInfo, MemberActivityInfo, |
|
9 |
- MemberActivitySigninInfo, MemberActivitySignupInfo, RightInfo, ShotTypeInfo) |
|
8 |
+from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContributionInfo, MemberActivityGroupShareInfo, |
|
9 |
+ MemberActivityInfo, MemberActivitySigninInfo, MemberActivitySignupInfo, RightInfo, |
|
10 |
+ ShotTypeInfo) |
|
10 | 11 |
from pre.custom_message import sendwxasubscribemessage |
11 | 12 |
from utils.redis.rshot import update_member_shot_data |
12 | 13 |
|
@@ -97,6 +98,11 @@ class MemberActivityGroupShareInfoAdmin(admin.ModelAdmin): |
||
97 | 98 |
list_filter = ('is_integral', 'status') |
98 | 99 |
|
99 | 100 |
|
101 |
+class MemberActivityContributionInfoAdmin(admin.ModelAdmin): |
|
102 |
+ list_display = ('contribution_id', 'activity_id', 'content_type', 'title', 'content', 'images', 'status', 'created_at', 'updated_at') |
|
103 |
+ list_filter = ('activity_id', 'content_type', 'status') |
|
104 |
+ |
|
105 |
+ |
|
100 | 106 |
admin.site.register(GoodsInfo, GoodsInfoAdmin) |
101 | 107 |
admin.site.register(GoodsOrderInfo, GoodsOrderInfoAdmin) |
102 | 108 |
admin.site.register(RightInfo, RightInfoAdmin) |
@@ -105,3 +111,4 @@ admin.site.register(MemberActivityInfo, MemberActivityInfoAdmin) |
||
105 | 111 |
admin.site.register(MemberActivitySignupInfo, MemberActivitySignupInfoAdmin) |
106 | 112 |
admin.site.register(MemberActivitySigninInfo, MemberActivitySigninInfoAdmin) |
107 | 113 |
admin.site.register(MemberActivityGroupShareInfo, MemberActivityGroupShareInfoAdmin) |
114 |
+admin.site.register(MemberActivityContributionInfo, MemberActivityContributionInfoAdmin) |
@@ -0,0 +1,38 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 3.2.16 on 2022-10-23 06:42 |
|
3 |
+ |
|
4 |
+from django.db import migrations, models |
|
5 |
+import jsonfield.fields |
|
6 |
+import shortuuidfield.fields |
|
7 |
+ |
|
8 |
+ |
|
9 |
+class Migration(migrations.Migration): |
|
10 |
+ |
|
11 |
+ dependencies = [ |
|
12 |
+ ('member', '0034_memberactivityinfo_limit_image_num'), |
|
13 |
+ ] |
|
14 |
+ |
|
15 |
+ operations = [ |
|
16 |
+ migrations.CreateModel( |
|
17 |
+ name='MemberActivityContributionInfo', |
|
18 |
+ fields=[ |
|
19 |
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
20 |
+ ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')), |
|
21 |
+ ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')), |
|
22 |
+ ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')), |
|
23 |
+ ('brand_id', models.CharField(blank=True, db_index=True, help_text='品牌唯一标识', max_length=32, null=True, verbose_name='brand_id')), |
|
24 |
+ ('brand_name', models.CharField(blank=True, help_text='品牌名称', max_length=255, null=True, verbose_name='brand_name')), |
|
25 |
+ ('contribution_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='投稿唯一标识', max_length=22, null=True, unique=True)), |
|
26 |
+ ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')), |
|
27 |
+ ('activity_id', models.CharField(blank=True, db_index=True, help_text='活动唯一标识', max_length=32, null=True, verbose_name='activity_id')), |
|
28 |
+ ('content_type', models.IntegerField(choices=[(0, '投稿'), (1, '入围'), (2, '创作日记')], db_index=True, default=0, help_text='内容类型', verbose_name='content_type')), |
|
29 |
+ ('title', models.CharField(blank=True, help_text='标题', max_length=255, null=True, verbose_name='title')), |
|
30 |
+ ('content', models.TextField(blank=True, help_text='内容', null=True, verbose_name='content')), |
|
31 |
+ ('images', jsonfield.fields.JSONField(default=[], help_text='图片列表', verbose_name='images')), |
|
32 |
+ ], |
|
33 |
+ options={ |
|
34 |
+ 'verbose_name': '会员活动投稿信息', |
|
35 |
+ 'verbose_name_plural': '会员活动投稿信息', |
|
36 |
+ }, |
|
37 |
+ ), |
|
38 |
+ ] |
@@ -601,6 +601,7 @@ class MemberActivitySignupInfo(BaseModelMixin): |
||
601 | 601 |
@property |
602 | 602 |
def admindata(self): |
603 | 603 |
return { |
604 |
+ 'signup_id': self.signup_id, |
|
604 | 605 |
'user_id': self.user_id, |
605 | 606 |
'activity_id': self.activity_id, |
606 | 607 |
'title': self.title, |
@@ -664,28 +665,50 @@ class MemberActivityGroupShareInfo(BaseModelMixin): |
||
664 | 665 |
|
665 | 666 |
|
666 | 667 |
class MemberActivityContributionInfo(BaseModelMixin): |
668 |
+ CONTENT_TYPE = ( |
|
669 |
+ (0, u'投稿'), |
|
670 |
+ (1, u'入围'), |
|
671 |
+ (2, u'创作日记'), |
|
672 |
+ ) |
|
673 |
+ |
|
667 | 674 |
brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) |
668 | 675 |
brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') |
669 | 676 |
|
670 |
- activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True) |
|
677 |
+ contribution_id = ShortUUIDField(_(u'contribution_id'), max_length=32, blank=True, null=True, help_text=u'投稿唯一标识', db_index=True, unique=True) |
|
671 | 678 |
|
672 |
- share_user_id = models.CharField(_(u'share_user_id'), max_length=32, blank=True, null=True, help_text=u'分享用户唯一标识', db_index=True) |
|
673 |
- click_user_id = models.CharField(_(u'click_user_id'), max_length=32, blank=True, null=True, help_text=u'点击用户唯一标识', db_index=True) |
|
679 |
+ user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) |
|
674 | 680 |
|
675 |
- open_gid = models.CharField(_(u'open_gid'), max_length=32, blank=True, null=True, help_text=u'群组唯一标识', db_index=True) |
|
681 |
+ activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True) |
|
676 | 682 |
|
677 |
- title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称') |
|
683 |
+ content_type = models.IntegerField(_(u'content_type'), choices=CONTENT_TYPE, default=0, help_text=u'内容类型', db_index=True) |
|
678 | 684 |
|
679 |
- is_integral = models.BooleanField(_(u'is_integral'), default=False, help_text=u'是否有积分') |
|
680 |
- integral = models.IntegerField(_(u'integral'), default=0, help_text=u'积分') |
|
685 |
+ # 传参图片列表(默认第一张为封面图,包括图片url、宽、高)、标题、内容(纯文本)。 |
|
686 |
+ title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'标题') |
|
687 |
+ content = models.TextField(_(u'content'), blank=True, null=True, help_text=u'内容') |
|
688 |
+ # content_rich_text = RichTextField(_(u'content_rich_text'), blank=True, default='', help_text=u'内容') |
|
689 |
+ # [{ |
|
690 |
+ # 'image_url': '', |
|
691 |
+ # 'width': 100, |
|
692 |
+ # 'height': 100, |
|
693 |
+ # }] |
|
694 |
+ images = JSONField(_(u'images'), default=[], help_text=u'图片列表') |
|
681 | 695 |
|
682 | 696 |
class Meta: |
683 |
- verbose_name = _(u'会员活动群组分享信息') |
|
684 |
- verbose_name_plural = _(u'会员活动群组分享信息') |
|
685 |
- |
|
686 |
- unique_together = ( |
|
687 |
- ('activity_id', 'share_user_id', 'click_user_id', 'open_gid', 'brand_id'), |
|
688 |
- ) |
|
697 |
+ verbose_name = _(u'会员活动投稿信息') |
|
698 |
+ verbose_name_plural = _(u'会员活动投稿信息') |
|
689 | 699 |
|
690 | 700 |
def __unicode__(self): |
691 | 701 |
return '%d' % self.pk |
702 |
+ |
|
703 |
+ @property |
|
704 |
+ def data(self): |
|
705 |
+ return { |
|
706 |
+ 'contribution_id': self.contribution_id, |
|
707 |
+ 'user_id': self.user_id, |
|
708 |
+ 'activity_id': self.activity_id, |
|
709 |
+ 'content_type': self.content_type, |
|
710 |
+ 'content_type_str': dict(MemberActivityContributionInfo.CONTENT_TYPE).get(self.content_type), |
|
711 |
+ 'title': self.title, |
|
712 |
+ 'content': self.content, |
|
713 |
+ 'images': self.images, |
|
714 |
+ } |